package appVeterinaria.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import appVeterinaria.excepcion.DAOExcepcion;
import appVeterinaria.modelo.Cita;
import appVeterinaria.modelo.Cliente;
import appVeterinaria.modelo.Historia;
import appVeterinaria.modelo.Paciente;
import appVeterinaria.util.ConexionBD;

public class PacienteDAO extends BaseDAO {
	
	
	public Collection<Paciente> listar() throws DAOExcepcion {
		Collection<Paciente> c = new ArrayList<Paciente>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select idPaciente, cliente_idCliente, nombre, especie, raza, genero, tipo_sangre, esterilizado, tamano, actividad, peso, fecha_nacimiento, cl.nombres, cl.apellidos from paciente p inner join cliente cl on p.cliente_idCliente=cl.idCliente";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				
				
				Cliente objCliente = new Cliente();				
				objCliente.setIdPersona(rs.getInt("cliente_idCliente"));
				objCliente.setNombres(rs.getString("nombres"));
				objCliente.setApellidos(rs.getString("apellidos"));
				Paciente vo = new Paciente();
				vo.setIdPaciente(rs.getInt("idPaciente"));
				vo.setObjCliente(objCliente);
				vo.setNombre(rs.getString("nombre"));
				vo.setEspecie(rs.getString("especie"));				
				vo.setRaza(rs.getString("raza"));
				vo.setGenero(rs.getString("genero"));
				vo.setTipoSangre(rs.getString("tipo_sangre"));
				vo.setEsterilizado(rs.getString("esterilizado"));
				vo.setTamano(rs.getString("tamano"));
				vo.setActividad(rs.getString("actividad"));									
				vo.setPeso(rs.getDouble("peso"));
				vo.setFecNac(rs.getString("fecha_nacimiento"));				
				
				//vo.setHistorialista(listarhistoria(rs.getInt("idPaciente")));
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	public Collection<Historia> listarHistoria(int idPaciente) {
		Collection<Historia> h = new ArrayList<Historia>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select paciente_idPaciente,cita_idCita, notas_medicas,cond_especiales, receta, imagenes, fecha_cita from hclinica_paciente order by fecha_cita";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Historia vo = new Historia();
				Paciente objPaciente= new Paciente();
				Cita objCita=new Cita();
				objPaciente.setIdPaciente(rs.getInt("paciente_idPaciente"));
				objCita.setIdCita(rs.getInt("cita_idCita"));	
				vo.setNotasmedicas(rs.getString("notas_medicas"));
				vo.setObjPaciente(objPaciente);
				vo.setObjCita(objCita);
				vo.setCondicionesEspeciales(rs.getString("cond_especiales"));
				vo.setReceta(rs.getString("receta"));
				vo.setImagenes(rs.getString("imagenes"));
				vo.setFecha_cita(rs.getString("fecha_cita"));
				h.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return h;
	}
	
	public Paciente insertar(Paciente vo) throws DAOExcepcion {
		String query = "insert into paciente (cliente_idCliente, nombre, especie, raza, genero, tipo_sangre, esterilizado, tamano, actividad, peso, fecha_nacimiento) values (?,?,?,?,?,?,?,?,?,?,?) ";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
		
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getObjCliente().getIdPersona());
			stmt.setString(2, vo.getNombre());
			stmt.setString(3, vo.getEspecie());
			stmt.setString(4, vo.getRaza());
			stmt.setString(5, vo.getGenero());
			stmt.setString(6, vo.getTipoSangre());
			stmt.setString(7, vo.getEsterilizado());
			stmt.setString(8, vo.getTamano());
			stmt.setString(9, vo.getActividad());
			stmt.setDouble(10, vo.getPeso());
			stmt.setString(11, vo.getFecNac());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			int id = 0;
			query = "select last_insert_id()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			vo.setIdPaciente(id);

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	
	public Paciente obtener(int idPaciente) throws DAOExcepcion {
		Paciente vo = new Paciente();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select idPaciente, cliente_idCliente, nombre, especie, raza, genero, tipo_sangre, esterilizado, tamano, actividad, peso, fecha_nacimiento, cl.nombres, cl.apellidos from paciente p inner join cliente cl on p.cliente_idCliente=cl.idCliente where idPaciente=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idPaciente);
			rs = stmt.executeQuery();
			if (rs.next()) {
				
				Cliente objCliente = new Cliente();				
				objCliente.setIdPersona(rs.getInt("cliente_idCliente"));
				objCliente.setApellidos(rs.getString("apellidos"));
				objCliente.setNombres(rs.getString("nombres"));	
				vo.setIdPaciente(rs.getInt("idPaciente"));
				vo.setObjCliente(objCliente);
				vo.setNombre(rs.getString("nombre"));
				vo.setEspecie(rs.getString("especie"));
				vo.setRaza(rs.getString("raza"));
				vo.setGenero(rs.getString("genero"));
				vo.setTipoSangre(rs.getString("tipo_sangre"));
				vo.setEsterilizado(rs.getString("esterilizado"));
				vo.setTamano(rs.getString("tamano"));
				vo.setActividad(rs.getString("actividad"));
				vo.setPeso(rs.getDouble("peso"));
				vo.setFecNac(rs.getString("fecha_nacimiento"));
				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public void eliminar(int idPaciente) throws DAOExcepcion {
		String query = "delete from paciente WHERE idPaciente=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idPaciente);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Paciente actualizar(Paciente vo) throws DAOExcepcion {
		String query = "update Paciente set cliente_idCliente=?,nombre=?,especie=?,raza=?,genero=?,tipo_sangre=?,esterilizado=?,tamano=?,actividad=?,peso=?,fecha_nacimiento=? where idPaciente=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getObjCliente().getIdPersona());
			stmt.setString(2, vo.getNombre());
			stmt.setString(3, vo.getEspecie());
			stmt.setString(4, vo.getRaza());
			stmt.setString(5, vo.getGenero());
			stmt.setString(6, vo.getTipoSangre());
			stmt.setString(7, vo.getEsterilizado());
			stmt.setString(8, vo.getTamano());
			stmt.setString(9, vo.getActividad());
			stmt.setDouble(10, vo.getPeso());
			stmt.setString(11, vo.getFecNac());
			stmt.setInt(12, vo.getIdPaciente());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	public int contar(String nombre, int idCliente) throws DAOExcepcion {
		int total =0;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select count(nombre) from veterinaria_db.paciente where nombre=?  and cliente_idCliente=? ";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, nombre);
			stmt.setInt(2, idCliente);
			
			rs = stmt.executeQuery();
			if (rs.next()) {
				total = rs.getInt(1);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return total;
	}
	public Collection<Paciente> buscarPorNombre(String nombre) throws DAOExcepcion {
		String query = "select idPaciente, cliente_idCliente, nombre, especie, raza, genero, tipo_sangre, esterilizado, tamano, actividad, peso, fecha_nacimiento, cl.nombres, cl.apellidos from paciente p inner join cliente cl on p.cliente_idCliente=cl.idCliente where nombre like ? ";
		System.out.println("queryu:"+query);
		Collection<Paciente> lista = new ArrayList<Paciente>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombre + "%");
			System.out.println("parametr "+nombre);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cliente objCliente = new Cliente();				
				objCliente.setIdPersona(rs.getInt("cliente_idCliente"));
				objCliente.setNombres(rs.getString("nombres"));
				objCliente.setApellidos(rs.getString("apellidos"));			
				Paciente vo = new Paciente();
				vo.setIdPaciente(rs.getInt("idPaciente"));
				vo.setObjCliente(objCliente);
				vo.setNombre(rs.getString("nombre"));
				vo.setEspecie(rs.getString("especie"));
				vo.setRaza(rs.getString("raza"));
				vo.setGenero(rs.getString("genero"));
				vo.setTipoSangre(rs.getString("tipo_sangre"));
				vo.setEsterilizado(rs.getString("esterilizado"));
				vo.setTamano(rs.getString("tamano"));
				vo.setActividad(rs.getString("actividad"));
				vo.setPeso(rs.getDouble("peso"));
				vo.setFecNac(rs.getString("fecha_nacimiento"));
				
					
				
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		//System.out.println(lista.size());
		return lista;
		}
}
